package demo01;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/*
 *  java.util.list接口 extends Collection接口
 *  List接口的特点：
 *      1. 有序的集合，存储元素和取出元素的顺序是一致的（存储顺序是123，取出顺序还是123）
 *      2. 有索引，包含一些带索引的方法
 *      3. 允许存储重复的元素
 *  
 *  List接口中带索引的特有方法：
 *      public void add(int index, E element)：将指定的元素，添加到该集合中的指定位置上
 *      public E get(int index)：返回集合中指定位置的元素
 *      public E remove(int index)：移除列表中指定位置的元素，返回的是被移除的元素
 *      public E set(int index, E element)：用指定元素替换集合中指定位置的元素，返回值是更新前的元素
 *  注意：操作索引的时候，一定要防止索引越界异常
 *      IndexOutOfBoundsException：索引越界异常，一般集合索引越界会报出
 *      ArrayIndexOutOfBoundsException：数组索引越界异常
 *      StringIndexOutOfBoundsException：字符串索引越界异常
 */
public class Demo01List {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(); // 创建一个List集合对象，使用多态
        list.add("土司鸡"); // 使用add方法往集合中添加元素
        list.add("土司只");
        list.add("土仔");
        list.add("土土");
        list.add("土司鸡");
        System.out.println(list); // [土司鸡, 土司只, 土仔, 土土, 土司鸡]，打印集合，该类重写了toString方法

        // public void add(int index, E element)：将指定的元素，添加到该集合中的指定位置上
        // 在土仔和土土之间添加一个粹花
        list.add(3, "粹花"); // 在第三个元素处添加
        System.out.println(list); // [土司鸡, 土司只, 粹花, 土仔, 土土, 土司鸡]

        // public E remove(int index)：移除列表中指定位置的元素，返回的是被移除的元素
        // 移除土仔元素
        String string = list.remove(2);
        System.out.println("被移除的元素：" + string); // 土仔
        System.out.println(list); // [土司鸡, 土司只, 粹花, 土土, 土司鸡]

        // public E set(int index, E element)：用指定元素替换集合中指定位置的元素，返回值是更新前的元素
        // 把最后一个土司鸡替换为土提
        String string2 = list.set(4, "土提");
        System.out.println("被替换的元素：" + string2); // 土司鸡
        System.out.println(list); // [土司鸡, 土司只, 粹花, 土土, 土提]

        // List集合遍历有3种方式
        // 1. 使用普通for循环遍历
        for (int i = 0; i < list.size(); i++) {
            // public E get(int index)：返回集合中指定位置的元素
            System.out.println(list.get(i)); // 土司鸡 土司只 粹花 土土 土提
        }
        System.out.println("=================");

        // 2. 使用迭代器遍历
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next()); // 土司鸡 土司只 粹花 土土 土提
        }
        System.out.println("=================");

        // 3. 使用增强for循环遍历
        for (String string3 : list) {
            System.out.println(string3); // 土司鸡 土司只 粹花 土土 土提
        }

        // list.get(5); // IndexOutOfBoundsException索引越界异常
    }
}
